<?php

namespace app\api\controller;

use app\common\controller\Api;

/**
 * 流式输出测试控制器
 */
class StreamTest extends Api
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];

    /**
     * 最简流式输出测试
     */
    public function minimal()
    {
        // 设置SSE响应头
        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
        header('Connection: keep-alive');
        header('Access-Control-Allow-Origin: *');
        header('X-Accel-Buffering: no');

        // 禁用输出缓冲
        while (ob_get_level()) {
            ob_end_clean();
        }

        // 禁用PHP输出缓冲
        ini_set('output_buffering', 'off');
        ini_set('zlib.output_compression', 'off');
        ini_set('implicit_flush', '1');

        // 启用自动刷新
        ob_implicit_flush(true);

        // 设置无限制执行时间
        set_time_limit(0);

        // 发送初始数据
        echo "retry: 1000\n\n";
        flush();

        // 发送几条测试消息
        for ($i = 1; $i <= 5; $i++) {
            echo "data: Message $i\n\n";
            flush();
            
            // 短暂延迟
            usleep(200000); // 0.2秒
        }

        // 发送结束标记
        echo "data: end\n\n";
        flush();

        exit;
    }
    
    /**
     * 事件型流式输出测试
     */
    public function events()
    {
        // 设置SSE响应头
        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
        header('Connection: keep-alive');
        header('Access-Control-Allow-Origin: *');
        header('X-Accel-Buffering: no');

        // 禁用输出缓冲
        while (ob_get_level()) {
            ob_end_clean();
        }

        // 禁用PHP输出缓冲
        ini_set('output_buffering', 'off');
        ini_set('zlib.output_compression', 'off');
        ini_set('implicit_flush', '1');

        // 启用自动刷新
        ob_implicit_flush(true);

        // 设置无限制执行时间
        set_time_limit(0);

        // 发送初始数据
        echo "retry: 1000\n\n";
        flush();

        // 发送开始事件
        echo "event: start\n";
        echo "data: 测试开始\n\n";
        flush();

        // 发送几条测试消息
        for ($i = 1; $i <= 5; $i++) {
            echo "event: message\n";
            echo "data: 测试消息 $i\n\n";
            flush();
            
            // 短暂延迟
            usleep(200000); // 0.2秒
        }

        // 发送结束事件
        echo "event: end\n";
        echo "data: 测试结束\n\n";
        flush();

        exit;
    }
}